package com.shujia.day05;

public class Demo03Extend {
    public static void main(String[] args) {
        /*
            TODO 继承关系
                当在Java中编写代码时，有时两个类直接存在一些逻辑上的关系，同时有一些变量及对应的方法存在重复编写
                于是，在代码中可以使用 extend 来表示两个类之间的关系，该关系只能用于表示继承(父子关系)
                    被继承的称为父类  继承的称为子类
                通过继承就可以获取父类中的相关代码

             继承关系的好处：
                1.提高了代码的复用性  父类代码可以直接被子类代码继承所使用
                2.提高了代码的维护性  如果功能的代码需要修改，修改一处即可
                3.让类与类之间产生了关系，是多态的前提 => 放到后面再介绍
                    代码之间产生依赖关系后，那么可以用 耦合性 来表示
                    耦合性太强的缺点：当上游代码发生改变时，会影响下游的 所以在开发过程中并不是所有的代码都要有很强的耦合性

             Java中继承的特点：
                1.一个类只能有一个父类，不可以有多个父类。为什么？
                        钻石问题
                2.Java支持多层继承(继承体系)


             Java中方法的重写:
                1.方法是通过继承或实现其他类或接口得到的
                2.对得到的方法逻辑进行重写
                3.对于方法的重写要求 参数列表 方法名 返回值都是一样的

                重写和重载的区别：
                    1.重写是对继承后的方法进行重新定义，重载是对当前类中的方法进行拓展
                    2.重写需要使用 @Override 而 重载 不需要

           TODO JAVA中继承的注意事项：
                1.子类只能继承父类所有非私有的成员(成员方法和成员变量)
                    私有表示使用private修饰的
                2.子类不能继承父类的构造方法，但是可以通过super(后面讲)关键字去访问父类构造方法。
                3.不要为了部分功能而去继承
                    如果两个类在逻辑上能形成 is a 关系， 一个类是另外一个类的XXX 就可以使用

         */

        Cat cat = new Cat("咪咪");
        cat.run();
        System.out.println(cat.name);
//        cat.run("招财");
        cat.procreate();
//        System.out.println(cat.clazz);
        cat.weight = "3斤";

        cat.show();
    }
}

class Animal {
    int weight;

    public void run() {
        System.out.println("动物能够游泳或行走..");
    }
}

class mammal extends Animal {
    private String clazz = "哺乳动物类";


    public void procreate() {
        System.out.println("哺乳动物都可以胎生...");
    }
}


/*
    使用Cat子类来继承父类Animal
 */
class Cat extends mammal {
    String weight;
//    String clazz = "猫类";

    String name;
//    public void run(){
//        System.out.println("动物能够行走..");
//    }

    public Cat(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "可以行走，爬树");
    }
    public void show(){
//        double weight = 3.2;
        System.out.println("猫咪叫:"+name+" 现在"+weight+"了");
    }
}

class Dog extends Animal {

}